package modelo.bd.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import modelo.bd.ConexionPool;
import modelo.bd.excepcion.DAOException;
import modelo.dominio.Correo;
import modelo.dominio.Usuario;
import modelo.servicio.Eventos;

public class CorreoDAO {

    private String query;

    protected List<Correo> select() throws DAOException {
        Connection conexion = null;
        PreparedStatement sentencia = null;
        ResultSet resultado = null;
        List<Correo> resultados = null;
        try {
            conexion = ConexionPool.getInstancia().getConexion();
            sentencia = conexion.prepareStatement(query);
            resultado = sentencia.executeQuery();
            resultados = new ArrayList<Correo>();
            while (resultado.next()) {
                Correo correo = new Correo();
                Usuario usuario = new Usuario(resultado.getString("usuario"));
                usuario.setNombre(resultado.getString("nombre_usuario"));
                correo.setUsuario(usuario);
                correo.setCorreo(resultado.getString("correo"));
                correo.setEstatus(resultado.getString("estatus"));
                correo.setComentarios(resultado.getString("comentarios") != null
                        ? resultado.getString("comentarios") : "");
                correo.setEvento(Eventos.instancia().porClave(resultado.getString("flujo"),
                        resultado.getString("paso"), resultado.getString("evento")));
                resultados.add(correo);
            }
        } catch (SQLException ex) {
            throw new DAOException("Error CODS-SQL " + ex.getMessage());
        } finally {
            try {
                if (resultado != null) {
                    resultado.close();
                }
                if (sentencia != null) {
                    sentencia.close();
                }
                if (conexion != null) {
                    conexion.close();
                }
            } catch (SQLException ex) {
                throw new DAOException("Error CODS-SQL " + ex.getMessage());
            }
        }
        return resultados;
    }

    public List<Correo> selectAll() throws DAOException {
        query = "SELECT cofl_uspe_clave  AS usuario, \n"
                + "       uspe_nombre      AS nombre_usuario, \n"
                + "       cofl_correo      AS correo, \n"
                + "       cofl_estatus     AS estatus, \n"
                + "       cofl_comentarios AS comentarios, \n"
                + "       dehf_fluj_clave  AS flujo, \n"
                + "       dehf_pafl_clave  AS paso, \n"
                + "       dehf_evfl_clave  AS evento \n"
                + "FROM   sil_detalle_historico_flujo, sil_correos_flujo, sil_usuarios_perfil \n"
                + "WHERE  cofl_fluj_clave  = dehf_fluj_clave \n"
                + "AND    cofl_hifl_numero = dehf_hifl_numero \n"
                + "AND    cofl_dehf_numero = dehf_numero \n"
                + "AND    uspe_clave       = cofl_uspe_clave \n";
        return select();
    }

    public List<Correo> selectWhere(String condition) throws DAOException {
        query = "SELECT cofl_uspe_clave  AS usuario, \n"
                + "       uspe_nombre      AS nombre_usuario, \n"
                + "       cofl_correo      AS correo, \n"
                + "       cofl_estatus     AS estatus, \n"
                + "       cofl_comentarios AS comentarios, \n"
                + "       dehf_fluj_clave  AS flujo, \n"
                + "       dehf_pafl_clave  AS paso, \n"
                + "       dehf_evfl_clave  AS evento \n"
                + "FROM   sil_detalle_historico_flujo, sil_correos_flujo, sil_usuarios_perfil \n"
                + "WHERE  cofl_fluj_clave  = dehf_fluj_clave \n"
                + "AND    cofl_hifl_numero = dehf_hifl_numero \n"
                + "AND    cofl_dehf_numero = dehf_numero \n"
                + "AND    uspe_clave       = cofl_uspe_clave \n"
                + "AND    " + condition
                + " ORDER BY dehf_fecha DESC";
        return select();
    }
}
